package com.xiaolin.structure.stack.array;

/**
 * @ClassName DemoStack
 * @Description 栈数据结构实现-根据数组实现
 * @Detail detail
 * @Author MyPC
 * @Date 2020/11/6
 * @Version 1.0
 */
public class DemoStack<E> {
    // 最大容量
    private int maxSize;
    // 存放元素的数组
    private Object[] elementArray;
    // 栈顶指针
    private int top;

    public DemoStack(int size){
        this.maxSize=size;
        elementArray=new Object[size];
        // 栈为空时栈顶指针为-1
        top=-1;
    }

    public DemoStack(){
        this.maxSize=1024;
        elementArray=new Object[1024];
        top=-1;
    }

    /**
     * 添加元素
     * @param e
     * @return
     */
    public boolean push(E e){
        if(top == maxSize -1){
            throw new IndexOutOfBoundsException("栈已满");
        }
        elementArray[++top]=e;
        return true;
    }

    /**
     * 弹出元素
     * @return
     */
    public E pop(){
        if(top < 0){
            throw new IndexOutOfBoundsException("栈为空");
        }
        E e = (E) elementArray[top--];
        //弹出的元素的索引位置置为null
        elementArray[top+1]=null;
        return e;
    }

    /**
     * 索引校验
     * @param index
     */
    private void indexCheckout(int index){
        if(index <0 || index >top){
            throw new IndexOutOfBoundsException("索引越界");
        }
    }

    /**
     * 根据索引获取元素
     * @param index
     * @return
     */
    public E get(int index){
        indexCheckout(index);
        int temp=top;
        for(int i=0;i<top-index;i++){
            temp--;
        }
        return (E)elementArray[temp];
    }

    /**
     * 获取顶峰元素
     * @return
     */
    public E peek(){
        if(top<0){
            return null;
        }
        return (E)elementArray[top];
    }

    /**
     * 判断是否为空栈
     * @return
     */
    public boolean isEmpty(){
        return top < 0 ;
    }
}

